#ifndef HISTOGRAM_H
#define HISTOGRAM_H

#include <QImage>
int otsu2(const QImage &image);
void minMax(QImage &image, int &min, int &max);
QVector<int> histogram(QImage &image);
bool histogram(QImage &image, unsigned int hist[256]);
bool normalizedHistogram(const QImage &image, double hist[256]);
bool histogram(const QImage &image, unsigned int red[256], unsigned int green[256], unsigned int blue[256]);
bool normalizedHistogram(const QImage &image, double red[256], double green[256], double blue[256]);

QImage histogramEqualization(QImage &image);

//直方图正规化，将图像图像最亮的地方线性拉伸到 255，最暗的地方线性拉伸到 0
QImage histogramNormalization(QImage &image);
void applyHistogramNormalization(QImage &image);
/**
 * @brief 计算一个最佳的阈值，这个阈值可以将图像前景色与背景色分离
 * @param image 待处理图像，必须为灰度图
 * @return 返回阈值，如果图像不是灰度图则返回 -1
*/
int otsu(const QImage &image);

/**
 * @brief 将灰度图像转换为黑白图像
 * @param image 待转换的图像，必须为灰度图像
 * @param th 设定的阈值，大于阈值的像素将转换为白色，小于阈值的像素将转换为黑色
 * @return 返回转换后的图像
*/
QImage threshold(const QImage &image, quint8 th);
void  applyThreshold(QImage &image, quint8 th);
/**
 * @brief 将图像转换为灰度图
 * @param image 待转换的图像
*/
QImage toGray( const QImage &image );
/**
 *  @brief 将灰度图转换为 RGB32 模式 
 *  @param [in] image 待转换的图像，必须为灰度图像
 *  @return 返回转换后的图像 
 *  @details image 必须是 Format_Indexed 格式
 */
QImage toRGB32( const QImage &image );
#endif
